clc;

img = imread("face_set\v3_0018007.jpg");
sz = size(img);
sz = sz(1:2);

%imshow(img);

% 获取皮肤
img_skin=skin(img);

se = strel('disk', 1); % 定义一个结构元素
img_skin1 = imopen(img_skin, se); % 开运算去除噪声
img_skin1 = imfill(img_skin1, 'holes'); % 填充空洞

% 算数平均滤波
% 和开操作一样是为了使整个脸部处于同一连通区域
filter=ones([3,3])/3*3;
img_skin_arr=imfilter(img_skin1,filter);

subplot(1,2,1);
imshow(img_skin);
title("肤色提取图像")
%subplot(1,3,2);
%imshow(img_skin_arr);
%title("平均滤波后图像")
subplot(1,2,2);
imshow(img_skin1);
title("开操作后图像");

% 找连通区域及其参数
% L为包裹连通区域的最小矩形，num为连通区域的数量
% BoundingBox=[x,y,width,height]
[L,num]=bwlabel(img_skin1,8);
stats = regionprops(L,'BoundingBox','Area', 'Orientation', "Eccentricity");
figure(2);
imshow(img);

% 滤除较小面积的以及比例不太正常的
areaThreshold= sz(1)*sz(2)*0.001;

% 根据条件绘制选框
hold on;
for i =1:numel(stats)
    bbox = stats(i).BoundingBox;
    area = stats(i).Area;
    orientation = stats(i).Orientation;
    eccentricity = stats(i).Eccentricity;
    if area < areaThreshold
        continue;
    end
    if abs(orientation) < 30
        continue;
    end
    if eccentricity > 0.9
        continue;
    end
    rectangle('Position',bbox,'EdgeColor','r','LineWidth',2);
end
hold off;
